#!/bin/bash

# 终极Linux持久化一键测试脚本 v2.0
# 配套Shell接口，提供简化操作

VERSION="2.0.0"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PYTHON_SCRIPT="$SCRIPT_DIR/ultimate_persistence_tester.py"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# 显示横幅
show_banner() {
    clear
    cat << 'EOF'
╔══════════════════════════════════════════════════════════════════════╗
║                    🔥 终极Linux持久化测试器 v2.0 🔥                    ║
║                        一键化Shell操作界面                            ║
╠══════════════════════════════════════════════════════════════════════╣
║  🚀 一键部署  |  🔍 智能检测  |  ✅ 实时验证  |  🧹 完整清理          ║
║  📊 详细报告  |  🛡️ 增强隐蔽  |  ⚡ 快速恢复  |  🎯 100%成功率        ║
╚══════════════════════════════════════════════════════════════════════╝
EOF
    echo
    echo -e "${CYAN}🆔 版本: $VERSION${NC}"
    echo -e "${CYAN}📅 时间: $(date '+%Y-%m-%d %H:%M:%S')${NC}"
    echo -e "${CYAN}📍 位置: $SCRIPT_DIR${NC}"
    echo "=" * 70
}

# 日志函数
log_info() {
    echo -e "${BLUE}[*]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[+]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[!]${NC} $1"
}

log_error() {
    echo -e "${RED}[-]${NC} $1"
}

log_step() {
    echo -e "${PURPLE}[>]${NC} $1"
}

# 检查依赖
check_dependencies() {
    log_info "检查系统依赖..."
    
    # 检查Python3
    if ! command -v python3 &> /dev/null; then
        log_error "Python3 未安装，请先安装: apt install python3"
        exit 1
    fi
    
    # 检查Root权限
    if [ $EUID -ne 0 ]; then
        log_error "需要Root权限运行此脚本"
        log_error "请使用: sudo bash $0"
        exit 1
    fi
    
    # 检查Python脚本
    if [ ! -f "$PYTHON_SCRIPT" ]; then
        log_error "Python脚本不存在: $PYTHON_SCRIPT"
        exit 1
    fi
    
    log_success "依赖检查通过"
}

# 系统信息检查
check_system_info() {
    log_info "获取系统信息..."
    
    echo -e "${CYAN}系统信息:${NC}"
    echo "  主机名: $(hostname)"
    echo "  内核: $(uname -r)"
    echo "  发行版: $(lsb_release -d 2>/dev/null | cut -f2 || echo 'Unknown')"
    echo "  架构: $(uname -m)"
    echo "  当前用户: $(whoami)"
    echo "  IP地址: $(ip route get 8.8.8.8 2>/dev/null | grep -oP 'src \K\S+' || echo 'Unknown')"
    echo
}

# 显示菜单
show_menu() {
    echo -e "${CYAN}请选择操作:${NC}"
    echo
    echo -e "${GREEN}1.${NC} 🚀 运行完整测试 (部署+验证+报告)"
    echo -e "${GREEN}2.${NC} 🔍 仅执行验证测试"
    echo -e "${GREEN}3.${NC} 🧹 清理测试环境"
    echo -e "${GREEN}4.${NC} 📊 生成测试报告"
    echo -e "${GREEN}5.${NC} 🛠️ 系统环境检测"
    echo -e "${GREEN}6.${NC} 📋 查看历史报告"
    echo -e "${GREEN}7.${NC} 🚨 紧急清理模式"
    echo -e "${GREEN}8.${NC} ❓ 帮助信息"
    echo -e "${GREEN}0.${NC} 🚪 退出程序"
    echo
    echo -n -e "${YELLOW}请输入选项 [0-8]: ${NC}"
}

# 运行完整测试
run_full_test() {
    log_step "启动完整测试流程..."
    echo
    
    log_info "这将执行以下步骤:"
    echo "  1. 系统环境检测"
    echo "  2. 部署6种持久化机制"
    echo "  3. 验证所有机制功能"
    echo "  4. 生成详细测试报告"
    echo
    
    read -p "确认继续? (y/N): " confirm
    if [[ $confirm =~ ^[Yy]$ ]]; then
        log_step "开始执行完整测试..."
        python3 "$PYTHON_SCRIPT" --test
        
        if [ $? -eq 0 ]; then
            log_success "完整测试执行成功!"
            show_test_results
        else
            log_error "测试执行失败!"
        fi
    else
        log_info "测试已取消"
    fi
}

# 仅执行验证
run_verification_only() {
    log_step "启动验证测试..."
    echo
    
    log_warning "此操作假设持久化机制已部署"
    read -p "确认继续验证? (y/N): " confirm
    
    if [[ $confirm =~ ^[Yy]$ ]]; then
        python3 "$PYTHON_SCRIPT" --verify
        
        if [ $? -eq 0 ]; then
            log_success "验证测试完成!"
        else
            log_error "验证测试失败!"
        fi
    else
        log_info "验证已取消"
    fi
}

# 清理测试环境
cleanup_environment() {
    log_step "启动环境清理..."
    echo
    
    log_warning "这将清理所有测试相关的文件和配置"
    log_warning "包括: 服务、计划任务、SSH密钥、别名等"
    echo
    
    read -p "确认清理? (y/N): " confirm
    if [[ $confirm =~ ^[Yy]$ ]]; then
        log_step "开始清理环境..."
        python3 "$PYTHON_SCRIPT" --cleanup
        
        if [ $? -eq 0 ]; then
            log_success "环境清理完成!"
        else
            log_error "环境清理失败!"
        fi
    else
        log_info "清理已取消"
    fi
}

# 生成测试报告
generate_report() {
    log_step "生成测试报告..."
    
    python3 "$PYTHON_SCRIPT" --report
    
    if [ $? -eq 0 ]; then
        log_success "测试报告生成完成!"
        show_available_reports
    else
        log_error "报告生成失败!"
    fi
}

# 系统环境检测
detect_environment() {
    log_step "执行详细系统环境检测..."
    echo
    
    # 基本信息
    echo -e "${CYAN}=== 基本系统信息 ===${NC}"
    echo "主机名: $(hostname)"
    echo "内核版本: $(uname -r)"
    echo "系统架构: $(uname -m)"
    echo "运行时间: $(uptime)"
    echo
    
    # 发行版信息
    echo -e "${CYAN}=== 发行版信息 ===${NC}"
    if [ -f /etc/os-release ]; then
        cat /etc/os-release
    else
        echo "无法获取发行版信息"
    fi
    echo
    
    # 网络信息
    echo -e "${CYAN}=== 网络信息 ===${NC}"
    echo "IP地址:"
    ip addr show | grep -E 'inet [0-9]' | awk '{print "  " $2}'
    echo
    
    # 服务状态
    echo -e "${CYAN}=== 关键服务状态 ===${NC}"
    for service in ssh sshd cron crond systemd; do
        status=$(systemctl is-active $service 2>/dev/null || echo "不存在")
        echo "  $service: $status"
    done
    echo
    
    # 防护软件检测
    echo -e "${CYAN}=== 安全防护检测 ===${NC}"
    for protection in firewalld ufw apparmor selinux; do
        if command -v $protection &> /dev/null; then
            echo "  $protection: 已安装"
        else
            echo "  $protection: 未安装"
        fi
    done
    echo
    
    # 磁盘空间
    echo -e "${CYAN}=== 磁盘空间 ===${NC}"
    df -h | head -5
    echo
    
    log_success "环境检测完成"
}

# 查看历史报告
show_historical_reports() {
    log_step "查看历史测试报告..."
    echo
    
    # 查找报告文件
    reports=$(find /tmp -name "persistence_test_report_*.md" 2>/dev/null | sort -r)
    
    if [ -z "$reports" ]; then
        log_warning "未找到历史报告文件"
        return
    fi
    
    echo -e "${CYAN}可用的测试报告:${NC}"
    echo
    
    count=1
    declare -a report_array
    
    for report in $reports; do
        filename=$(basename "$report")
        session_id=$(echo "$filename" | grep -oP 'persistence_test_report_\K[0-9_]+')
        size=$(ls -lh "$report" | awk '{print $5}')
        date=$(stat -c %y "$report" | cut -d' ' -f1,2 | cut -d'.' -f1)
        
        echo -e "${GREEN}$count.${NC} 会话ID: $session_id"
        echo "   文件: $filename"
        echo "   大小: $size"
        echo "   时间: $date"
        echo
        
        report_array[$count]="$report"
        ((count++))
    done
    
    echo -n "选择要查看的报告 (1-$((count-1)), 0=返回): "
    read choice
    
    if [[ "$choice" =~ ^[1-9][0-9]*$ ]] && [ "$choice" -lt "$count" ]; then
        selected_report="${report_array[$choice]}"
        log_info "显示报告: $(basename "$selected_report")"
        echo
        cat "$selected_report"
        echo
        read -p "按回车键继续..."
    elif [ "$choice" != "0" ]; then
        log_warning "无效选择"
    fi
}

# 紧急清理模式
emergency_cleanup() {
    log_step "启动紧急清理模式..."
    echo
    
    log_error "⚠️ 警告: 紧急清理将强制删除所有相关组件"
    log_error "⚠️ 此操作不可逆，请谨慎使用"
    echo
    
    read -p "输入 'EMERGENCY' 确认紧急清理: " confirm
    
    if [ "$confirm" = "EMERGENCY" ]; then
        log_step "执行紧急清理..."
        
        # 停止服务
        systemctl stop system-update-checker 2>/dev/null || true
        systemctl disable system-update-checker 2>/dev/null || true
        rm -f /etc/systemd/system/system-update-checker.service
        systemctl daemon-reload
        
        # 清理进程
        pkill -f "file_monitor.sh" 2>/dev/null || true
        
        # 清理文件
        rm -rf /tmp/persistence_test* 2>/dev/null || true
        rm -rf /tmp/persistence_logs* 2>/dev/null || true
        rm -f /root/.ssh/test_backdoor* 2>/dev/null || true
        rm -f /tmp/trigger_file 2>/dev/null || true
        
        # 清理配置
        sed -i '/Test backdoor key/,+1d' /root/.ssh/authorized_keys 2>/dev/null || true
        sed -i '/Environment variable trigger/,+4d' /root/.bashrc 2>/dev/null || true
        sed -i '/Alias backdoor/,+2d' /root/.bashrc 2>/dev/null || true
        
        # 清理crontab
        crontab -l 2>/dev/null | grep -v "System maintenance task" | crontab - 2>/dev/null || true
        
        log_success "紧急清理完成"
    else
        log_info "紧急清理已取消"
    fi
}

# 显示帮助信息
show_help() {
    cat << 'EOF'

🔥 终极Linux持久化测试器 v2.0 - 帮助文档

📋 功能说明:
  本工具专为Linux系统持久化机制测试设计，支持6种主要持久化技术:
  
  1. SSH密钥后门 - 通过SSH公钥实现持久访问
  2. Systemd服务 - 创建系统服务实现持久化
  3. Crontab任务 - 利用计划任务定期执行
  4. 环境变量触发器 - 通过环境变量触发执行
  5. 文件触发器 - 监控特定文件变化触发
  6. Bashrc别名 - 通过shell别名实现隐蔽执行

🚀 使用方法:
  sudo bash one_click_persistence_test.sh

📊 测试流程:
  1. 系统环境检测 - 自动识别系统配置和安全状态
  2. 一键部署 - 自动部署所有持久化机制
  3. 实时验证 - 验证每个机制的功能性
  4. 详细报告 - 生成JSON和Markdown格式报告
  5. 完整清理 - 恢复系统到初始状态

🛡️ 安全特性:
  - 自动备份重要配置文件
  - 支持紧急清理模式
  - 详细的操作日志记录
  - 信号处理和异常恢复

📁 文件位置:
  - 测试目录: /tmp/persistence_test/
  - 日志目录: /tmp/persistence_logs/
  - 备份目录: /tmp/persistence_backup/
  - 报告文件: /tmp/persistence_test_report_*.md

⚠️ 注意事项:
  1. 仅在授权的测试环境中使用
  2. 测试前请备份重要数据
  3. 测试完成后及时清理环境
  4. 不要在生产环境中运行

🔗 更多信息:
  项目地址: HackerPermKeeper T00ls v7.0
  技术支持: 查看项目文档

EOF
}

# 显示测试结果
show_test_results() {
    echo
    log_info "查看测试结果..."
    
    # 查找最新的报告
    latest_report=$(find /tmp -name "persistence_test_report_*.md" 2>/dev/null | sort -r | head -1)
    
    if [ -n "$latest_report" ]; then
        log_success "找到最新报告: $(basename "$latest_report")"
        echo
        read -p "是否查看详细报告? (y/N): " view_report
        
        if [[ $view_report =~ ^[Yy]$ ]]; then
            cat "$latest_report"
        fi
    else
        log_warning "未找到测试报告"
    fi
}

# 显示可用报告
show_available_reports() {
    echo
    reports=$(find /tmp -name "persistence_test_report_*" 2>/dev/null)
    
    if [ -n "$reports" ]; then
        echo -e "${CYAN}生成的报告文件:${NC}"
        for report in $reports; do
            echo "  📄 $report"
        done
    fi
}

# 主函数
main() {
    # 设置错误处理
    set -e
    trap 'log_error "脚本执行中断"; exit 1' INT TERM
    
    # 显示横幅
    show_banner
    
    # 检查依赖
    check_dependencies
    
    # 显示系统信息
    check_system_info
    
    # 主循环
    while true; do
        echo
        show_menu
        read choice
        
        case $choice in
            1)
                run_full_test
                ;;
            2)
                run_verification_only
                ;;
            3)
                cleanup_environment
                ;;
            4)
                generate_report
                ;;
            5)
                detect_environment
                ;;
            6)
                show_historical_reports
                ;;
            7)
                emergency_cleanup
                ;;
            8)
                show_help
                ;;
            0)
                log_info "感谢使用终极Linux持久化测试器!"
                exit 0
                ;;
            *)
                log_warning "无效选项，请重新选择"
                ;;
        esac
        
        echo
        read -p "按回车键继续..."
    done
}

# 脚本入口
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    main "$@"
fi